package com.zenithmind.classroom.pojo.vo;

import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 学习统计VO
 * 
 * @author ZenithMind Team
 * @since 2025-01-09
 */
@Data
@Schema(description = "学习统计VO")
public class LearningStatisticsVO {

    /**
     * 统计时间范围开始
     */
    @Schema(description = "统计时间范围开始")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime startTime;

    /**
     * 统计时间范围结束
     */
    @Schema(description = "统计时间范围结束")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime endTime;

    /**
     * 总学习时长（分钟）
     */
    @Schema(description = "总学习时长（分钟）")
    private Integer totalStudyMinutes;

    /**
     * 总学习天数
     */
    @Schema(description = "总学习天数")
    private Integer totalStudyDays;

    /**
     * 连续学习天数
     */
    @Schema(description = "连续学习天数")
    private Integer continuousStudyDays;

    /**
     * 最长连续学习天数
     */
    @Schema(description = "最长连续学习天数")
    private Integer maxContinuousStudyDays;

    /**
     * 平均每日学习时长（分钟）
     */
    @Schema(description = "平均每日学习时长（分钟）")
    private Integer avgDailyStudyMinutes;

    /**
     * 学习课程数量
     */
    @Schema(description = "学习课程数量")
    private Integer courseCount;

    /**
     * 完成课程数量
     */
    @Schema(description = "完成课程数量")
    private Integer completedCourseCount;

    /**
     * 学习章节数量
     */
    @Schema(description = "学习章节数量")
    private Integer chapterCount;

    /**
     * 完成章节数量
     */
    @Schema(description = "完成章节数量")
    private Integer completedChapterCount;

    /**
     * 学习课时数量
     */
    @Schema(description = "学习课时数量")
    private Integer lessonCount;

    /**
     * 完成课时数量
     */
    @Schema(description = "完成课时数量")
    private Integer completedLessonCount;

    /**
     * 课程完成率
     */
    @Schema(description = "课程完成率")
    private Double courseCompletionRate;

    /**
     * 章节完成率
     */
    @Schema(description = "章节完成率")
    private Double chapterCompletionRate;

    /**
     * 课时完成率
     */
    @Schema(description = "课时完成率")
    private Double lessonCompletionRate;

    /**
     * 学习效率评分
     */
    @Schema(description = "学习效率评分")
    private Double efficiencyScore;

    /**
     * 学习质量评分
     */
    @Schema(description = "学习质量评分")
    private Double qualityScore;

    /**
     * 专注度评分
     */
    @Schema(description = "专注度评分")
    private Double focusScore;

    /**
     * 活跃度评分
     */
    @Schema(description = "活跃度评分")
    private Double activityScore;

    /**
     * 综合评分
     */
    @Schema(description = "综合评分")
    private Double overallScore;

    /**
     * 学习笔记数量
     */
    @Schema(description = "学习笔记数量")
    private Integer noteCount;

    /**
     * 提问数量
     */
    @Schema(description = "提问数量")
    private Integer questionCount;

    /**
     * 讨论参与数量
     */
    @Schema(description = "讨论参与数量")
    private Integer discussionCount;

    /**
     * 练习完成数量
     */
    @Schema(description = "练习完成数量")
    private Integer exerciseCount;

    /**
     * 考试参与数量
     */
    @Schema(description = "考试参与数量")
    private Integer examCount;

    /**
     * 考试通过数量
     */
    @Schema(description = "考试通过数量")
    private Integer examPassedCount;

    /**
     * 考试通过率
     */
    @Schema(description = "考试通过率")
    private Double examPassRate;

    /**
     * 平均考试分数
     */
    @Schema(description = "平均考试分数")
    private Double avgExamScore;

    /**
     * 获得成就数量
     */
    @Schema(description = "获得成就数量")
    private Integer achievementCount;

    /**
     * 达成里程碑数量
     */
    @Schema(description = "达成里程碑数量")
    private Integer milestoneCount;

    /**
     * 学习排名
     */
    @Schema(description = "学习排名")
    private Integer ranking;

    /**
     * 超越用户百分比
     */
    @Schema(description = "超越用户百分比")
    private Double beatPercentage;

    /**
     * 最活跃学习时段
     */
    @Schema(description = "最活跃学习时段")
    private String mostActiveHour;

    /**
     * 最常用学习设备
     */
    @Schema(description = "最常用学习设备")
    private String mostUsedDevice;

    /**
     * 学习偏好分析
     */
    @Schema(description = "学习偏好分析")
    private LearningPreference preference;

    /**
     * 每日学习统计
     */
    @Schema(description = "每日学习统计")
    private List<DailyStatistics> dailyStatistics;

    /**
     * 每周学习统计
     */
    @Schema(description = "每周学习统计")
    private List<WeeklyStatistics> weeklyStatistics;

    /**
     * 每月学习统计
     */
    @Schema(description = "每月学习统计")
    private List<MonthlyStatistics> monthlyStatistics;

    /**
     * 分类学习统计
     */
    @Schema(description = "分类学习统计")
    private List<CategoryStatistics> categoryStatistics;

    /**
     * 设备使用统计
     */
    @Schema(description = "设备使用统计")
    private Map<String, Integer> deviceUsageStatistics;

    /**
     * 时段学习统计
     */
    @Schema(description = "时段学习统计")
    private Map<String, Integer> hourlyStatistics;

    /**
     * 学习趋势
     */
    @Schema(description = "学习趋势")
    private LearningTrend trend;

    /**
     * 学习偏好
     */
    @Data
    @Schema(description = "学习偏好")
    public static class LearningPreference {
        
        /**
         * 偏好的学习时段
         */
        @Schema(description = "偏好的学习时段")
        private String preferredTimeSlot;
        
        /**
         * 偏好的学习设备
         */
        @Schema(description = "偏好的学习设备")
        private String preferredDevice;
        
        /**
         * 偏好的课程类型
         */
        @Schema(description = "偏好的课程类型")
        private String preferredCourseType;
        
        /**
         * 偏好的学习方式
         */
        @Schema(description = "偏好的学习方式")
        private String preferredLearningStyle;
        
        /**
         * 平均学习时长（分钟）
         */
        @Schema(description = "平均学习时长（分钟）")
        private Integer avgSessionMinutes;
    }

    /**
     * 每日统计
     */
    @Data
    @Schema(description = "每日统计")
    public static class DailyStatistics {
        
        /**
         * 日期
         */
        @Schema(description = "日期")
        private String date;
        
        /**
         * 学习时长（分钟）
         */
        @Schema(description = "学习时长（分钟）")
        private Integer studyMinutes;
        
        /**
         * 完成课时数
         */
        @Schema(description = "完成课时数")
        private Integer completedLessons;
        
        /**
         * 学习质量评分
         */
        @Schema(description = "学习质量评分")
        private Double qualityScore;
    }

    /**
     * 每周统计
     */
    @Data
    @Schema(description = "每周统计")
    public static class WeeklyStatistics {
        
        /**
         * 周次
         */
        @Schema(description = "周次")
        private String week;
        
        /**
         * 学习时长（分钟）
         */
        @Schema(description = "学习时长（分钟）")
        private Integer studyMinutes;
        
        /**
         * 学习天数
         */
        @Schema(description = "学习天数")
        private Integer studyDays;
        
        /**
         * 完成课时数
         */
        @Schema(description = "完成课时数")
        private Integer completedLessons;
    }

    /**
     * 每月统计
     */
    @Data
    @Schema(description = "每月统计")
    public static class MonthlyStatistics {
        
        /**
         * 月份
         */
        @Schema(description = "月份")
        private String month;
        
        /**
         * 学习时长（分钟）
         */
        @Schema(description = "学习时长（分钟）")
        private Integer studyMinutes;
        
        /**
         * 学习天数
         */
        @Schema(description = "学习天数")
        private Integer studyDays;
        
        /**
         * 完成课程数
         */
        @Schema(description = "完成课程数")
        private Integer completedCourses;
    }

    /**
     * 分类统计
     */
    @Data
    @Schema(description = "分类统计")
    public static class CategoryStatistics {
        
        /**
         * 分类ID
         */
        @Schema(description = "分类ID")
        private String categoryId;
        
        /**
         * 分类名称
         */
        @Schema(description = "分类名称")
        private String categoryName;
        
        /**
         * 学习时长（分钟）
         */
        @Schema(description = "学习时长（分钟）")
        private Integer studyMinutes;
        
        /**
         * 课程数量
         */
        @Schema(description = "课程数量")
        private Integer courseCount;
        
        /**
         * 完成率
         */
        @Schema(description = "完成率")
        private Double completionRate;
    }

    /**
     * 学习趋势
     */
    @Data
    @Schema(description = "学习趋势")
    public static class LearningTrend {
        
        /**
         * 趋势方向（up/down/stable）
         */
        @Schema(description = "趋势方向")
        private String direction;
        
        /**
         * 变化百分比
         */
        @Schema(description = "变化百分比")
        private Double changePercentage;
        
        /**
         * 趋势描述
         */
        @Schema(description = "趋势描述")
        private String description;
        
        /**
         * 预测下周学习时长
         */
        @Schema(description = "预测下周学习时长")
        private Integer predictedNextWeekMinutes;
    }
}
